package com.daigoudao.util;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import org.apache.commons.io.FileUtils;

public class FileUtil extends FileUtils {
	
	private static final int BUFFER_SIZE = 16 * 1024;
	
	/**
	 * 创建一个新的目录
	 * @param dirPath
	 * @return
	 */
	public static boolean createDir(String dirPath){
		if(dirPath==null){
			return false;
		}
		File file = new File(dirPath);
		
		if(!file.exists()){
			return file.mkdirs();
		}
		
		//存在且是目录
		if(file.exists() && file.isDirectory()){
			return true;
		}
		
		return false;
	}

	public static File getFileDirOrCreate(String dirpath, String fileName) {
		try {
			if (!(new File(dirpath).isDirectory())) {
				new File(dirpath).mkdir();
			}
		} catch (SecurityException e) {
			e.printStackTrace();
		}
		File dstFile = new File(dirpath + fileName);
		return dstFile;
	}

	/**
	 * 拷贝文件
	 * 
	 * @param src
	 * @param dst
	 * @throws Exception
	 */
	public static void copy(File src, File dst) throws Exception {

		try {
			InputStream in = null;
			OutputStream out = null;
			try {
				in = new BufferedInputStream(new FileInputStream(src),
						BUFFER_SIZE);
				out = new BufferedOutputStream(new FileOutputStream(dst),
						BUFFER_SIZE);
				byte[] buffer = new byte[BUFFER_SIZE];
				while (in.read(buffer) > 0) {
					out.write(buffer);
				}
			} finally {
				if (null != in) {
					in.close();
				}
				if (null != out) {
					out.close();
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
			throw new Exception();
		}
	}

	/**
	 * 拷贝本地文件
	 * 
	 * @param tmpsImage
	 *            拷贝地址
	 * @param image
	 *            拷贝源
	 * @param fileName
	 *            文件名字
	 */
	public static void copy(String tmpsImage, String image) {

		File tmpImage = new File(tmpsImage);
		if (tmpImage.exists()) {
			File imageFile = new File(image);
			if (imageFile.exists())
				try {
					imageFile.createNewFile();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			try {
				FileUtil.copy(tmpImage, imageFile);
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			tmpImage = new File(tmpsImage);
			tmpImage.delete();
		}
	}

	/**
	 * 拷贝本地文件
	 * 
	 * @param tmpsImage
	 *            拷贝地址
	 * @param image
	 *            拷贝源
	 * @param fileName
	 *            文件名字
	 * 
	 *            拷贝完不删除原文件
	 */
	public static void copyDel(String tmpsImage, String image) {
		File tmpImage = new File(tmpsImage);
		if (tmpImage.exists()) {
			File imageFile = new File(image);
			if (imageFile.exists())
				try {
					imageFile.createNewFile();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			try {
				FileUtil.copy(tmpImage, imageFile);
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

		}
	}

	/**
	 * 删除文件
	 * 
	 * @param delFile
	 */
	public static void deleteFile(File delFile) {
		delFile.delete();
	}

	/**
	 * 得到文件的后缀名
	 * 
	 * @param fileName
	 * @return
	 */
	public static String getExtention(String fileName) {
		int pos = fileName.lastIndexOf(".");
		return fileName.substring(pos);
	}

	/**
	 * 文件改名
	 * 
	 * @param file
	 * @param rName
	 */
	public static void rename(File file, File rName) {
		file.renameTo(rName); // 改名
	}

	/**
	 * 文件改名
	 * 
	 * @param file
	 * @param rName
	 */
	public static void rename(String filePath, String rPath, String mf) {
		File file1 = new File(rPath);
		File tar = new File(filePath);
		File file2 = new File(mf);
		if (file1.isFile()) {
			try {
				copy(file1, tar);
			} catch (Exception e) {
				e.printStackTrace();
			}
			file1.delete();
		} else {
			try {
				copy(file2, tar);
			} catch (Exception e) {
				e.printStackTrace();
			}
			file2.delete();
		}

	}

	/**
	 * 删除此路径名表示的文件或目录。 如果此路径名表示一个目录，则会先删除目录下的内容再将目录删除，所以该操作不是原子性的。
	 * 如果目录中还有目录，则会引发递归动作。
	 * 
	 * @param filePath
	 *            要删除文件或目录的路径。
	 * @return 当且仅当成功删除文件或目录时，返回 true；否则返回 false。
	 */
	public static boolean deleteFileBy(String filePath) {
		File file = new File(filePath);
		return deleteFileBy(file);
	}

	private static boolean deleteFileBy(File file) {
		File[] files = file.listFiles();
		if (files == null) {
			return false;
		}
		for (File deleteFile : files) {
			if (deleteFile.isDirectory()) {
				// 如果是文件夹，则递归删除下面的文件后再删除该文件夹
				if (!deleteFileBy(deleteFile)) {
					// 如果失败则返回
					return false;
				}
			} else {
				if (!deleteFile.delete()) {
					// 如果失败则返回
					return false;
				}
			}
		}
		return file.delete();
	}
}
